orm - Rails has_many :through association: retrieve foreign attribute through foreign key -


in our rails app, there 3 models:

class user < activerecord::base   has_many :administrations, dependent: :destroy   has_many :calendars, through: :administrations end  class administration < activerecord::base   belongs_to :user   belongs_to :calendar end  class calendar < activerecord::base   has_many :administrations, dependent: :destroy   has_many :users, through: :administrations end 

and here corresponding migrations:

class createusers < activerecord::migration   def change     create_table :users |t|       t.string :first_name       t.string :last_name       t.string :email        t.timestamps null: false     end   end end  class createadministrations < activerecord::migration   def change     create_table :administrations |t|       t.references :user, index: true, foreign_key: true       t.references :calendar, index: true, foreign_key: true       t.string :role        t.timestamps null: false     end   end end  class createcalendars < activerecord::migration   def change     create_table :calendars |t|       t.string :name        t.timestamps null: false     end   end end 

edit: here our userscontroller:

class userscontroller < applicationcontroller   before_action :logged_in_user, only: [:edit, :update, :destroy]   before_action :correct_user,   only: [:edit, :update]   before_action :admin_user,     only: [:index, :destroy]    def index     @users = user.paginate(page: params[:page], :per_page => 10)   end    def show     @user = user.find(params[:id])     @administrations = @user.administrations     @calendar = current_user.calendars.build if logged_in?   end    def new     @user = user.new   end    def create     @user = user.new(user_params)     if @user.save       @user.send_activation_email       flash[:info] = "please check email activate account."       redirect_to root_url     else       render 'new'     end   end    def edit     @user = user.find(params[:id])   end    def update     @user = user.find(params[:id])     if @user.update_attributes(user_params)       flash[:success] = "profile updated"       redirect_to @user     else       render 'edit'     end   end    def destroy     user.find(params[:id]).destroy     flash[:success] = "user deleted"     redirect_to users_url   end    private      def user_params       params.require(:user).permit(:first_name, :last_name, :email,                                     :password, :password_confirmation)     end      # before filters      # confirms correct user.     def correct_user       @user = user.find(params[:id])       redirect_to(root_url) unless current_user?(@user)     end      # confirms admin user.     def admin_user       redirect_to(root_url) unless current_user.try(:admin?)     end  end 

once user logged in (authentication system , running), want display on profile (users#show), calendars has created.

we have seeded database following instances:

user.create!(first_name:  "andy") # user's id 1.  calendar.create!(name: "calendara")  calendar.create!(name: "calendarb")  calendar.create!(name: "calendarc")  administration.create!(user_id: 1, calendar_id: 1, role: "creator")  administration.create!(user_id: 1, calendar_id: 2, role: "editor")  administration.create!(user_id: 1, calendar_id: 3, role: "viewer") 

then, have created _administration.html.erb partial:

<li id="administration-<%= administration.id %>">   <span class="name"><%= administration.calendar_id %></span> </li> 

and included in our user show.html.erb file:

<p><%= @user.first_name %>'s calendars</p> <% if @user.administrations.any? %> <%= render @administrations %> <% end %> 

and working, get:

andy's calendars:

  • 1
  • 2
  • 3

however, each user, not ids of calendars, names too, this:

andy's calendars:

  • 1 calendara
  • 2 calendarb
  • 3 calendarc

so tried update _administration.html.erb partial follows:

<li id="administration-<%= administration.id %>">   <span class="name"><%= administration.calendar_id.name %></span> </li> 

which results in following error:

nomethoderror in userscontroller#show  undefined method `name' 1:fixnum  application trace | framework trace | full trace app/views/administrations/_administration.html.erb:2:in `_app_views_administrations__administration_html_erb__2225316747000531998_70329866860100' app/views/users/show.html.erb:32:in `_app_views_users_show_html_erb___891585127045041471_70329832995240' 

how can access "foreign" attribute name calendar model through foreign key calendar_id in join administration model?

administration.calendar.name should work if associations set correctly.

alternatively, add method administration:

def calendar_name   calendar.name end 

and call administration.calendar_name


Comments

Popular posts from this blog

OpenCV OpenCL: Convert Mat to Bitmap in JNI Layer for Android -

android - org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope -

python - How to remove the Xframe Options header in django? -