Do Rails 3 Active Record动态find_or_create finder方法有一些无证的不一致吗?

时间:2011-01-15 02:52:45

标签: ruby-on-rails-3 activerecord

为长标题道歉,但这困扰着我。我是Rails的新手,所以这是我的第一个项目。 Rails 3.0.3。

在我的模型中,User可能会或可能不会阅读很多Entries;这在名为ReadEntries的模型中被跟踪。我认为,这种多对一关系在代码中得到了恰当的定义。

User.rb:

has_many :read_entries

Entry.rb:

has_many :read_entries

ReadEntry.rb:

belongs_to :entry
belongs_to :user

此表必须在某个时候填充。如果我尝试这样做:

user.read_entries.find_or_create_by_entry_id(entry.id, :read => false)

我收到错误Unknown key(s): read。不要试图设置:read,它可以正常工作。

但是,如果我用它创建相同的行,它可以工作:

ReadEntry.find_or_create_by_entry_id_and_user_id(entry.id, user.id, :read => false)

从逻辑上讲,这些方法应该是相同的,对吗?感谢。

2 个答案:

答案 0 :(得分:1)

你无法传递其他类似的字段,因为Rails会认为它们是查找的选项。相反,您需要更长时间地调用方法:

user.read_entries.find_or_create_by_entry_id_and_read(entry.id, false)

或者使用更短的自定义语法。

对于你的最后一个例子,我的想法是Rails将采用第二个参数并将其用作选项。除此之外,我不确定。

答案 1 :(得分:1)

我也有过find_or_create的奇怪经历。如果有效的话,我会喜欢它,但似乎不一致。

我目前遇到与您相同的问题,我认为这可能是由于在关联上调用find_or_create而不是直接调用模型。这是我的例子:

    permission_assignments.find_or_create_by_role_id(:role_id => role_id, :is_allowed => false)

这可用于创建赋值,但“is_allowed”字段设置为默认值“true”。此代码适用于我(在权限模型中,因此自我引用)

    PermissionAssignment.find_or_create_by_permission_id_and_role_id(:permission_id => self.id, :role_id => role_id, :is_allowed => false)

不幸的是,它更加冗长,但它确实有效。我仍然注意到的唯一问题是返回的对象没有分配id(但是,记录确实在数据库中创建,但是如果我想更新任何更多的属性,我将无法在没有id的情况下) 。不知道这是否是一个单独的问题。

Rails 3.0.4与Postgres 8.4