无法在Rails应用程序中查找和显示关系模型中的记录列表

时间:2015-03-26 16:20:21

标签: mysql sql ruby-on-rails ruby

我有一个关系模型,用于跟踪has_many :through关联中商店的客户(用户)。我在使用ShopsController时遇到问题并查找给定商店的关系列表,然后显示它们。

我的错误是RecordNotFound,Couldn't find Relationship with 'id'=所以我遇到了如何创建和识别关系的问题。当商店登录时,需要根据user_id找到它们(然后给出current_shop_id)我如何重新设计以使关系/展示工作?

在当前版本中,商店通过关系拥有多个用户:

class Shop < ActiveRecord::Base
  has_many :relationships
  has_many :users, through: :relationships

Relationships获取用户的id和shop的id并创建一个关系id:

schema.rb

create_table "relationships", force: :cascade do |t|
    t.integer  "user_id"
    t.integer  "shop_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_index "relationships", ["shop_id"], name: "index_relationships_on_shop_id"


  add_index "relationships", ["user_id", "shop_id"], name: "index_relationships_on_user_id_and_shop_id", unique: true
  add_index "relationships", ["user_id"], name: "index_relationships_on_user_id"

在商店模型中添加了一个用户:

  # New relationship
  def add(user)
    relationships.create(user.id)
  end

  # Unfollows a user.
  def remove(user)
    relationships.find_by(user.id).destroy
  end

@relationships在车间控制器中定义:

def relationships
@title = "Following"
@relationships = Relationship.find(params[:relationship_id])
@users = @shop.relationships.paginate(page: params[:page])
render 'show_relationships'
end

并在关系控制器中创建关系

  def create
    user = User.find(params[user_id: user.id])
    current_shop.add(user)
    redirect_to user
  end

然后这些关系应该显示在relationship / show

  <div class="col-md-8">
    <h3><%= @title %></h3>
    <% if @relationships.any? %>
      <ul class="users follow">
        <%= render @relationships %>
      </ul>
    <% end %>
  </div>

3 个答案:

答案 0 :(得分:2)

您控制器中的relationships方法已到处都是。

您正在尝试使用不存在params[:relationship_id]的ID来查找关系 S ,这会导致您看到的错误。

然后,您将@users设置为@shop的所有关系。

然后您要呈现模板show_relationships,但稍后会引用relationships/show模板。

此外,在商店模型中,您仅使用用户ID调用create,而您希望传递关系的某些属性。

看起来这个代码变得更加混乱和混乱,因为你试图解决问题。说实话,我会回到起点然后重新开始。

答案 1 :(得分:2)

如果我理解你的用例,一家商店有很多顾客,顾客经常光顾很多商店。

执行此操作Rails方式的结果是,您只需使用该商店的实例并致电shop.customers即可检索属于特定商店的客户。您可以通过调用{{shop.customers.find(:id)找到该商店的特定客户1}}如果您尝试呼叫其他商店客户,则会获得ActiveRecord::RecordNotFoundError

反之亦然。要检索客户经常光顾的商店,理想情况下您需要customer.shops等。要向客户添加新商店,请使用customer.shops.create("Arkwrights Dairy")

正如Shadwell所说,你目前创建这个结构的努力远比你需要的复杂得多。并且您不通过控制器设置它,只能通过模型​​。

模特,仅限2人

class Shop < ActiveRecord::Base
  has_and_belongs_to_many :customers

class Customer < ActiveRecord::Base
  has_and_belongs_to_many :shops

迁移,3

class SampleMigration < ActiveRecord::Migration
  def change
    create_table :shops do |t|
      t.string :name
    end

    create_table :customers do |t|
      t.string  :name
    end

    create_table :customers_shops, id: false do |t|
      t.belongs_to :customer
      t.belongs_to :shop  
    end
  end
end

根据您的需要为模型添加更多细节,但这足以建立关系。值得注意的是复数,商店诗歌商店很重要。购物课和belongs_to:商店都是单数。许多商店的参考是复数,桌子有很多商店,所以也是复数。连接表必须按字母顺序排列,customers_shops不是shop_customers。

设置完成后,运行迁移然后尝试。

shop = Shop.create(name: "Dairy")
=> #<Shop id:1, name: "Dairy">
shop.customers.create(name: "Bill")
=> #<Customer id:1, name: "Bill">

customer = Customer.find(1)
=> #<Customer id:1, name: "Bill">
customer.shops
=> [#<Shop id:1, name: "Dairy">]

请注意,商店会返回一个数组。使用customer.shops [0]访问第一个元素,或者使用customer.shops.find(1)访问第一个元素:id

希望这能为您提供所需的基础: - )

答案 2 :(得分:0)

  

...对于特定的商店......

这表明您应该找到Shop的实例,并使用关联来检索相应的用户。我希望在面向商店的视图中看到这一点,而不是关系视图,并且在商店中有一个关联:

has_many :users, through => :relationships