Rails多对多未知专栏

时间:2014-02-27 18:02:10

标签: ruby-on-rails rails-migrations

我有两个模型,一个用户和一个消息。

  

消息 有许多 收件人。

     

用户 收到了许多 消息。

     

因此,消息 拥有并属于许多 收件人。

  

消息 有一个 创建者。

     

用户 创建了许多 消息。

我认为我的结构正确,但是我遇到了一些问题,所以我想确保我做对了。

迁移:

def self.up
    create_table :users_messages, :id => false do |t|
        t.integer :message_id
        t.integer :user_id
    end

    add_index :users_messages, [:user_id, :message_id]
end

  def change
    add_column :messages, :creator_id, :integer
  end

User.rb:

has_and_belongs_to_many :messages
belongs_to :message, foreign_key: "creator_id"

Message.rb:

belongs_to :creator, :class_name => "User"
has_and_belongs_to_many :users

但是当我运行这个查询时:

Message.where("users.id = 1")

我明白了:

Unknown column 'users.id'

我错过了什么?

3 个答案:

答案 0 :(得分:1)

您已在消息表中添加了creator_id列,因此belongs_to声明应位于消息模型中。

在用户模型中,您应该有has_one :message

属于的人是具有ID

的人

更多详情here


关于消息查询,如果在Message类中创建范围,如:

    named_scope: :with_user, lambda{ |user|
      joins(:users).
      where("messages_users.user_id =  ?", user.id)
    }


   # EDIT: You could even use the association name as joins parameter and Rails will take care of the rest.

您只需拨打Message.with_user(some_user),然后继续链接其他示波器。

答案 1 :(得分:1)

好的,你有几个问题:

  1. 如果您想获取给定用户的所有消息,您可以执行类似user.messages,而不是Message.where("users.id = 1")的操作。 Rails将为您处理SQL。
  2. 您的联接表应命名为messages_users,而不是users_messages。表名应该是按字母顺序连接表的名称。
  3. User.rb中,belongs_to :message, foreign_key: "creator_id"应为has_many :created_messages, foreign_key: "creator_id",因为用户可以(我假设)创建了许多消息。 belongs_to始终用于具有外键的模型。关系的另一面将是has_onehas_many

答案 2 :(得分:0)

这个video帮助了我这个概念

在Rails中设置多对多关联有两种不同的方法。在本集中,您将了解如何实现这两种方式以及为项目选择正确方法的一些提示。