Ruby on rails Rails:一个命令中的多级模型参考

Ruby on rails Rails:一个命令中的多级模型参考,ruby-on-rails,activerecord,content-management-system,Ruby On Rails,Activerecord,Content Management System,我正在rails中构建一个CMS,目前需要一个动态的多层次实现来访问特定用户拥有的特定餐厅的活动。简而言之,我创建的数据模型如下所示: class User < ActiveRecord::Base has_many :restaurants, dependent: :destroy end class Restaurant < ActiveRecord::Base belongs_to :user validates :user_id, presen

我正在rails中构建一个CMS,目前需要一个动态的多层次实现来访问特定用户拥有的特定餐厅的活动。简而言之,我创建的数据模型如下所示:

class User < ActiveRecord::Base 
    has_many :restaurants, dependent: :destroy
end

class Restaurant < ActiveRecord::Base

    belongs_to :user
    validates  :user_id, presence: true

    has_many :campaigns, dependent: :destroy
end

class Campaign < ActiveRecord::Base
    belongs_to :restaurant
end
然而,这仅仅是在
nomethoderror
上的
未定义方法
活动中产生的# 操作步骤如下:1)用户登录,2)用户已显示其拥有的餐厅列表, 3) 用户单击某个餐厅,视图将动态更改以显示该餐厅的活动。 有没有合适的方法在rails中实现多级动态模型引用,以便用户能够完成概述的操作,并停留在一个页面内,避免导航离开

编辑更新的添加内容

目前,我为用户提供了
显示
,如下所示:

<% provide(:title, @user.name) %>
<div class="row">
    <aside class="span4">
        <section>
            <h1>
                <%= gravatar_for @user %>
                <%= @user.name %>
            </h1>
        </section>
        <section>
            <% if @user.locations.any? %>
                <div>
                    <%= link_to "Start a Campaign", newcampaign_path, class: "btn btn-medium btn-primary" %>
                </div>
                <%= link_to "Manage Locations", uploadlocations_path %>     
            <% else %>
                <%= link_to "Upload Locations", uploadlocations_path, class: "btn btn-medium btn-primary" %> 
            <% end %>
        </section>
        <section>

            <%# disply list of restaurants%>

            <%= link_to "Add New Restaurant", newrestaurant_path, class: "btn btn-medium btn-primary" %>
            <ul class ="campaigns">
                <%= render @restaurants %>
            </ul>

        </section>
    </aside>
    <div class="span8">
        <% if @restaurants.any? %>

            <ol class="campaigns">
                <%= render @campaigns, object: @restaurants %>
            </ol>

        <% end %>
    </div>
</div>
如何让用户单击菜单中的餐厅,并将所选的特定餐厅发送回用户显示页面中的

@restaurant = @user.restaurants.find {|r| r.id == 1 } # or select your particular restaurant
@restaurant.campaigns # 1 query for getting all campaigns for a specific user-restaurant pair
或者,您可能想在餐厅和活动中快速加载

@user = User.includes(restaurants: :campaigns)
从1+n(餐厅)查询到1+1+1查询(用户、所有餐厅、然后是所有活动)


编辑(或编辑):

观点:

@restaurants.each do |restaurant|
  @restaurant_campaigns[restaurant] # campaigns for user-restaurant pair
end

我说这可能是因为您没有添加可访问属性,请尝试在餐厅模型中添加这一行,并告诉我它是否有效如果您在控制器中使用参数,您不需要为第一个@user.restaurants.Find{Id==1}使用可访问属性,用户如何选择特定的餐厅?使用我提供的餐厅选择部分?这是我的主要问题,将选定的餐厅传递到同一页面,但在编辑中。这只是一个例子。您想要的任何餐厅。在模型中,用户只能查看他们拥有的餐厅,您的实现是否允许这样做?我已更新以向您显示我的视图和侧边栏菜单。如何实现用户点击餐厅?使用链接到是否正确?
@user = User.includes(restaurants: :campaigns)
class User < ActiveRecord::Base 
  has_many :restaurants, dependent: :destroy, inverse_of: :user
  has_many :campaigns, through: :restaurants
end

class Restaurant < ActiveRecord::Base
  belongs_to :user, inverse_of: :restaurants
  validates  :user_id, presence: true

  has_many :campaigns, dependent: :destroy, inverse_of: :restaurant
end

class Campaign < ActiveRecord::Base
  belongs_to :restaurant, inverse_of: :campaigns
end
@user = User.includes(campaigns: :restaurant)
@restaurant_campaigns = Hash.new([]).merge @user.campaigns.group_by(&:restaurant)
@restaurants = @restaurant_campaigns.keys
@restaurants.each do |restaurant|
  @restaurant_campaigns[restaurant] # campaigns for user-restaurant pair
end