为长标题道歉,但这困扰着我。我是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)
从逻辑上讲,这些方法应该是相同的,对吗?感谢。
答案 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